
package study.service;

import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.barney.support.domain.HasCreatedAndUpdatedDate;
import com.barney.support.domain.HasCreatedDate;
import com.barney.support.domain.HasUpdatedDate;

/**
 * 추상 서비스
 *
 * @author Barney Kim
 */
public abstract class AbstractService {

	protected Logger logger = LoggerFactory.getLogger(getClass());

	/**
	 * 대상을 저장하기 전에 실행하면 지금 일시를 사용하여 해당 값을 설정한다.
	 * <code>{@link HasCreatedAndUpdatedDate}의 구현체이면 생성일시와 변경일시를 지금 일시로 설정하고
	 * <code>{@link HasCreatedDate}의 구현체이면 생성일시를 지금 일시로 설정한다.
	 *
	 * @param obj 대상
	 * @see HasCreatedAndUpdatedDate
	 * @see HasCreatedDate
	 */
	public void prePersist(Object obj) {
		if(obj instanceof HasCreatedAndUpdatedDate) {
			setCreatedAndUpdatedDate((HasCreatedAndUpdatedDate)obj);
		} else
		if(obj instanceof HasCreatedDate) {
			setCreatedDate((HasCreatedDate)obj);
		}
	}

	/**
	 * 대상을 변경하기 전에 실행하면 지금 일시를 사용하여 변경일시를 설정한다.
	 *
	 * @param obj 대상
	 * @see HasCreatedAndUpdatedDate
	 * @see HasUpdatedDate
	 */
	public void preUpdate(Object obj) {
		if(obj instanceof HasCreatedAndUpdatedDate ||
			obj instanceof HasUpdatedDate) {
			setUpdatedDate((HasUpdatedDate)obj);
		}
	}

	private void setCreatedDate(HasCreatedDate obj) {
		obj.setCreatedDate(new Date());
	}

	private void setUpdatedDate(HasUpdatedDate obj) {
		obj.setUpdatedDate(new Date());
	}

	private void setCreatedAndUpdatedDate(HasCreatedAndUpdatedDate obj) {
		Date d = new Date();
		obj.setCreatedDate(d);
		obj.setUpdatedDate(d);
	}
}
